<?php 
class venda_visitacompModel extends Model{
    public $tabela = 'venda_visitacomp';
    public $pkey   = array("venda_funcionario_cod", "venda_visita_cod");
    public $dados  = array(
         
         'venda_funcionario_cod' => array(
	    'name'     => 'Funcionário',
	    'type'     => 'int',
	    'size'     => '11',
	    'pkey'    => true,
	    'grid'    => true,
	    'display' => true,
	    'fkey' => array(
	        'model' => 'venda/funcionario',
	        'cardinalidade' => '1n',
	        'keys' => array('venda_funcionario_cod', 'venda_funcionario_nome'),
	    ),
        ),
               
        'venda_visita_cod' => array(
	    'name'     => 'Visita',
	    'type'     => 'int',
	    'size'     => '11',
	    'grid'    => true,
	    'display' => true,
            'pkey'    => true,
            'private' => true,
	    'especial' => 'session',
	    'session'  => 'venda/visita',
	    'fkey' => array(
	        'model' => 'venda/visita',
	        'cardinalidade' => '1n',
	        'keys' => array('venda_visita_cod', 'venda_visita_descricao'),
	    ),
        ),
        
        'cod_usuario' => array(
	    'name'     => 'Vendedor',
	    'type'     => 'int',
	    'size'     => '11',
            'especial' => 'autentication',
            'autentication' => array('needlogin' => true),
	    'grid'    => true,
	    'fkey' => array(
	        'model' => 'usuario/login',
	        'cardinalidade' => '1n',
	        'keys' => array('cod_usuario', 'user_name', 'user_cargo'),
                'onupdate' => 'cascade',
                'ondelete' => 'restrict',
	    ),
        ),
        
        'criado' => array(
	    'name'     => 'Data de Adição',
	    'type'     => 'timestamp',
            'especial' => 'hide',
	    'grid'    => true,
        ),
        
        'venda_visitacomp_status' => array(
	    'name'     => 'Status',
	    'type'     => 'enum',
	    'default' => 'pendente',
            'notnull' => true,
	    'options' => array(
                'pendente'        => 'Pendente',
                'negado'          => 'Recusado pelo Telemarketing',
                'confirmado'      => 'Aprovado pelo Telemarketing',
                'compareceu'      => 'Compareceu ao Evento',
                'ausente'         => 'Não Compareceu ao Evento',
                'matriculado'     => 'Matriculado',
                'naomatriculado'  => 'Não Matriculado',
	    ),
	    'grid'    => true,
	    'display' => true,
        ),
         
        'venda_visitacomp_telemkt' => array(
	    'name'     => 'Atendente Telemarketing',
	    'type'     => 'int',
	    'size'     => '11',
	    'grid'    => true,
	    'display' => true,
	    'fkey' => array(
	        'model' => 'usuario/login',
	        'cardinalidade' => '1n',
	        'keys' => array('cod_usuario', 'user_name', 'user_cargo'),
	    ),
        ),
        
	'button' => array('button' => 'Enviar'));
    
    public function inserir($dados) {
        if(!isset($dados['cod_usuario'])) $dados['cod_usuario'] = "";
        if(!parent::inserir($dados)){ return false;}
        $this->saveLog("Funcionário %funcionario% adicionado ao evento pelo usuário %usuario%.", $dados['venda_funcionario_cod']);
        if(isset($_SESSION['venda/evento'])) $this->alertar($dados['venda_funcionario_cod'], $_SESSION['venda/evento']);
        return true;
    }
    
    public function apagar($valor, $chave = "") {
        if(!parent::apagar($valor, $chave)) return false;
        $this->saveLog("O funcionário %funcionario% não comparecerá mais no evento! Ele foi removido pelo usuário %usuario%.",
                $valor[0]);
        return true;
    }
    
    private function saveLog($msg, $cod_func){
        if($msg == "") return;
        
        $this->LoadModel('venda/funcionario', 'func');
        $funcionario = $this->func->getItem($cod_func);
        if(empty($funcionario)) return;
        $funcionario = $funcionario['venda_funcionario_nome'];
        $this->LoadModel('usuario/login', 'lobj');
        $usuario = $this->lobj->getUserNick();
        $msg = str_replace(array('%usuario%','%funcionario%'), array($usuario, $funcionario), $msg);
        
        $this->LoadModel('venda/empresalog', 'elog');
        $this->LoadModel('venda/visitahist', 'vh');
            
        if(!$this->elog->Log($msg))
            $this->setAlertMessage($this->elog->getErrorMessage());
        elseif(!$this->vh->Log($msg))
            $this->setAlertMessage($this->vh->getErrorMessage());
    }
    
    private function alertar($cod_funcionario, $cod_evento){
        
        //carrega as classes
        $this->LoadModel('venda/evento', 'ev');
        $this->LoadModel('venda/funcionario', 'fc');
        $this->LoadResource('email', 'mail');
        $this->LoadResource('html', 'html');

        //seta os dados
        $email_funcionario = $this->fc->getEmailPrincipal($cod_funcionario);
        $assunto = $this->ev->getTituloEvento($cod_evento);
        $link    = $this->html->getLink("venda/evento/show/$cod_evento/".GetPlainName($assunto));
        $corpo   = "
            Você recebeu o informativo do evento $assunto <br/> 
            Para ver mais detalhes do evento <a href='$link'>clique aqui</a> 
        ";
        
        //envia o alerta
        if(!$this->mail->sendMail($assunto, $corpo, SITE_EMAIL, $email_funcionario, SITE_NOME)){
            $this->setAlertMessage("Não foi possível enviar o link do evento por email para o funcionário");
            return false;
        }
        return true;
    }
    
    public function paginate($page, $link = "", $cod_item = "", $campo = "", $qtd = 20, $campos = array(), $adwhere = "", $order = "") {
        
        $this->LoadModel('usuario/login', 'uobj');
        $perfil = $this->uobj->getCodPerfil();
        $cod_usuario = usuario_loginModel::CodUsuario();
            if(CURRENT_CONTROLLER == 'visitacomp'){
            if($perfil == TELEMARKETING)$WHS = "venda_visitacomp_telemkt = '$cod_usuario'";
            elseif($perfil == VENDEDOR) $WHS = "$this->tabela.cod_usuario = '$cod_usuario'";
            if(isset($WHS)) $adwhere = ($adwhere != "")? "$WHS AND ($adwhere)":$WHS;
        }
        $this->LoadModel('venda/funcionario','func');
        $tb_func = $this->func->getTable();
        
        $this->LoadModel('venda/evento','ev');
        $this->LoadModel('venda/visita','vis');
        $tb_ev = $this->ev->getTable();
        $tb_vis = $this->vis->getTable();
        $this->db->join($tb_vis, $tb_ev, array('venda_evento_cod'), array('venda_evento_cod'),"LEFT");

        $campos = $this->getCampos();
        $campos[] = "$tb_vis.venda_visita_status as 'Status Funcionário'";
        $campos[] = "$tb_func.venda_funcionario_cargo as Cargo";
        $campos[] = "$tb_ev.venda_evento_titulo as Evento";
        $campos[] = "$tb_func.pessoal_telefone_numero as Telefone1";
        $campos[] = "$tb_func.pessoal_telefone_numero2 as Telefone2";
        
        $WH      = "now() > DATE_ADD(venda_visita_criado, INTERVAL ".TEMPO_ALTERACAO_VENDEDOR.")";
        $adwhere = ($adwhere != "")? "$WH AND ($adwhere)":$WH;
        return parent::paginate($page, $link, $cod_item, $campo, $qtd, $campos, $adwhere, $order);
    }
    
    public function changeStatus($cod, $status){
        $cod_usuario = usuario_loginModel::CodUsuario();
        $this->log($cod, $status, $cod_usuario);
        $post['venda_visitacomp_status']  = $status;
        $post['venda_visitacomp_telemkt'] = $cod_usuario;
        return parent::editar($cod, $post);
    }
    
    private function log($cod, $status, $cod_usuario){
        if(empty($cod) || count($cod) != 2) return;
        
        $_SESSION['venda/visita'] = $cod[1];
        $this->LoadModel('usuario/login', 'uobj');
        $user = $this->uobj->getUserNick($this->uobj->getItem($cod_usuario));
        
        $cod_funcionario = $cod[0];
        $this->LoadModel('venda/funcionario', 'func');
        $funcionario = $this->func->getName($cod_funcionario);
        
        $this->LoadModel('venda/visitahist', "vh");
        $st = $this->dados['venda_visitacomp_status']['options'][$status];
        $this->vh->Log("O usuário $user alterou a participação do funcionário $funcionario para \"$st\"");
    }

    public function confirmado($page, $wh = ""){
        $adwhere = "venda_visitacomp_status = 'confirmado' ";
        $wh      = ($wh == "")?$adwhere:"$wh AND $adwhere";
        return $this->filtherByStatus($page, $adwhere);
    }
    public function negado($page){
        $adwhere = "venda_visitacomp_status = 'negado' AND venda_evento_status NOT IN('encerrado')";
        return $this->filtherByStatus($page, $adwhere);
    }
    public function pendente($page){
        $adwhere = "venda_visitacomp_status = 'pendente' AND (venda_visita_status = 'aprovou' OR venda_visita_status = 'pendente')
            AND venda_evento_status NOT IN('encerrado')";
        return $this->filtherByStatus($page, $adwhere);
    }
    public function recusou($page){
        $adwhere = "venda_visita_status = 'recusou' AND venda_visitacomp_status = 'pendente' AND venda_evento_status NOT IN('encerrado')";
        return $this->filtherByStatus($page, $adwhere);
    }
    
    public function compareceu($page){
        $adwhere = "venda_visitacomp_status = 'compareceu'";
        return $this->filtherByStatus($page, $adwhere);
    }
    
    public function matriculado($page){
        $adwhere = "venda_visitacomp_status = 'matriculado'";
        return $this->filtherByStatus($page, $adwhere);
    }
    public function nmatriculado($page){
        $adwhere = "venda_visitacomp_status = 'naomatriculado'";
        return $this->filtherByStatus($page, $adwhere);
    }
    private function filtherByStatus($page, $where){
        return $this->paginate($page, '', '', '', 100, array(), $where);
    }
    
    public function checkTelemarketinCanAlter($cod_visita, $comp_status){
        $this->LoadModel('venda/visita', 'vis');
        $item = $this->vis->getItem($cod_visita);
        if(timeResource::diffDate($item['venda_visita_criado'], '', PRAZO_VENDEDOR_TIPO) < PRAZO_VENDEDOR_NUM){
            $this->setErrorMessage("O telemarketing só pode alterar a visita quando o prazo de alteração do vendedor acabar!");
            return false;
        }
        
        if(in_array($comp_status, array('ausente','compareceu', 'matriculado','naomatriculado'))){
            $this->setErrorMessage("Você não pode modificar o status de quem já compareceu no evento");
            return false;
        }
        return true;
    }
    
    public function distribuirVisitasPorAtendentes(){
        $this->LoadClassFromPlugin('venda/visitacomp/distribuirChamadas', 'dcham');
        $this->dcham->init($this);
        if(!$this->dcham->distribuir()){
            $this->setMessages($this->dcham->getMessages());
            return false;
        }
        $this->setSuccessMessage('Chamadas distribuídas corretamente!');
        return true;
    }
    
}
?>